﻿using System;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace schtasks2
{
    public static class ValidationExtensions
    {
        // 为 Argument<T> 添加扩展方法
        public static Argument<T> ValidateNotEmpty<T>(this Argument<T> argument)
        {
            argument.AddValidator(result =>
            {
                // 获取参数值
                var value = result.GetValueOrDefault<T>();

                // 处理字符串类型的空值验证
                if (typeof(T) == typeof(string))
                {
                    if (string.IsNullOrWhiteSpace(value as string))
                    {
                        result.ErrorMessage = $"参数 '{result.Argument.Name}' 不能为空。";
                    }
                }
                // 处理可空值类型的空值验证
                else if (Nullable.GetUnderlyingType(typeof(T)) != null)
                {
                    if (EqualityComparer<T>.Default.Equals(value, default))
                    {
                        result.ErrorMessage = $"参数 '{result.Argument.Name}' 不能为空。";
                    }
                }
                // 处理引用类型的空值验证
                else if (typeof(T).IsClass && value == null)
                {
                    result.ErrorMessage = $"参数 '{result.Argument.Name}' 不能为空。";
                }
            });

            return argument;
        }

        // 验证选项不能为空
        public static Option<T> ValidateNotEmpty<T>(this Option<T> option)
        {
            option.AddValidator(result =>
            {
                var value = result.GetValueOrDefault<T>();

                if (typeof(T) == typeof(string) && string.IsNullOrWhiteSpace(value as string))
                    result.ErrorMessage = $"选项 '--{result.Option.Name}' 不能为空";

                else if (typeof(T).IsClass && value == null)
                    result.ErrorMessage = $"选项 '--{result.Option.Name}' 不能为空";

                else if (Nullable.GetUnderlyingType(typeof(T)) != null &&
                         EqualityComparer<T>.Default.Equals(value, default))
                    result.ErrorMessage = $"选项 '--{result.Option.Name}' 不能为空";
            });

            return option;
        }

        public static bool ValidateOptionNotEmpty<T>(
           this ParseResult parseResult,
           Option<T> option,
           out T value)
        {
            value = parseResult.GetValueForOption(option);

            if (typeof(T) == typeof(string) && string.IsNullOrWhiteSpace(value as string))
            {
                Console.WriteLine($"错误: --{option.Name} 选项不能为空");
                return false;
            }

            if (typeof(T).IsClass && value == null)
            {
                Console.WriteLine($"错误: --{option.Name} 选项不能为空");
                return false;
            }

            if (Nullable.GetUnderlyingType(typeof(T)) != null &&
                EqualityComparer<T>.Default.Equals(value, default))
            {
                Console.WriteLine($"错误: --{option.Name} 选项不能为空");
                return false;
            }

            return true;
        }
    }
}
